//
//  AddTwoNumbers.swift
//  LeetCodeSummary
//
//  Created by WangYonghe on 2020/6/30.
//  Copyright © 2020 WangYonghe. All rights reserved.
//  2. 两数相加

import UIKit

/*
 2. 两数相加
 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。

 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。

 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。

 示例：

 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 输出：7 -> 0 -> 8
 原因：342 + 465 = 807
 */

class AddTwoNumbers: NSObject {
     
    func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
        //构建dummy节点  该节点指向目标链表的第一个元素
        let dummyNode = ListNode(0)
        
        var node1 = l1
        var node2 = l2
        var resultNode = dummyNode
        
        //记录加法进位
        var carry = 0
        
        while node1 != nil || node2 != nil {
            var x = 0
            if node1 != nil {
                x = node1!.val
            }
            
            var y = 0
            if node2 != nil {
                y = node2!.val
            }
            
            //进行累加
            let sum = x + y + carry
            carry = sum/10
            //给dummy节点加上后续节点
            resultNode.next = ListNode(sum%10)
            resultNode = resultNode.next!
            
            if node1 != nil {
                node1 = node1?.next
            }
            if node2 != nil {
                node2 = node2?.next
            }
        }
        //最后一位相加也进了一位
        if carry > 0 {
            resultNode.next = ListNode(carry)
        }
        
        //dummy节点的后续就是结果链表
        return dummyNode.next
    }
    
}
